home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / MethodExpression.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  10.4 KB  |  332 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import java.util.Vector;
  6. import sun.tools.asm.Assembler;
  7. import sun.tools.java.AmbiguousField;
  8. import sun.tools.java.ClassDeclaration;
  9. import sun.tools.java.ClassDefinition;
  10. import sun.tools.java.ClassNotFound;
  11. import sun.tools.java.CompilerError;
  12. import sun.tools.java.Constants;
  13. import sun.tools.java.Environment;
  14. import sun.tools.java.FieldDefinition;
  15. import sun.tools.java.Identifier;
  16. import sun.tools.java.Type;
  17.  
  18. public class MethodExpression extends NaryExpression {
  19.    // $FF: renamed from: id sun.tools.java.Identifier
  20.    Identifier field_0;
  21.    ClassDefinition clazz;
  22.    FieldDefinition field;
  23.    final int MAXINLINECOST = 30;
  24.  
  25.    public MethodExpression(int var1, Expression var2, Identifier var3, Expression[] var4) {
  26.       super(47, var1, Type.tError, var2, var4);
  27.       this.field_0 = var3;
  28.    }
  29.  
  30.    public MethodExpression(int var1, Expression var2, FieldDefinition var3, Expression[] var4) {
  31.       super(47, var1, var3.getType().getReturnType(), var2, var4);
  32.       this.field_0 = var3.getName();
  33.       this.field = var3;
  34.       this.clazz = var3.getClassDefinition();
  35.    }
  36.  
  37.    public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
  38.       Object var6 = null;
  39.       boolean var7 = false;
  40.       Type[] var8 = new Type[super.args.length];
  41.  
  42.       try {
  43.          ClassDeclaration var15;
  44.          if (super.right == null) {
  45.             var7 = var2.field.isStatic();
  46.             var15 = var2.field.getClassDeclaration();
  47.          } else {
  48.             if (this.field_0.equals(Constants.idInit)) {
  49.                if (!var2.field.isConstructor()) {
  50.                   var1.error(super.where, "invalid.constr.invoke");
  51.                   return var3 | 1L;
  52.                }
  53.  
  54.                if ((var3 & 1L) != 0L) {
  55.                   var1.error(super.where, "constr.invoke.not.first");
  56.                   return var3;
  57.                }
  58.  
  59.                super.right.checkValue(var1, var2, var3 | 1L, var5);
  60.             } else {
  61.                IdentifierExpression[] var9 = new IdentifierExpression[1];
  62.                Expression var10 = FieldExpression.mungeFieldRight(super.right, var1, var2, var9);
  63.                if (var10 == null) {
  64.                   var1.error(var9[0].where, "undef.var", var9[0].id);
  65.                   return var3;
  66.                }
  67.  
  68.                super.right = var10;
  69.                if (var10 instanceof TypeExpression) {
  70.                   var7 = true;
  71.                } else {
  72.                   var3 = super.right.checkValue(var1, var2, var3, var5);
  73.                }
  74.             }
  75.  
  76.             if (super.right.type.isType(10)) {
  77.                var15 = var1.getClassDeclaration(super.right.type);
  78.             } else {
  79.                if (!super.right.type.isType(9)) {
  80.                   if (!super.right.type.isType(13)) {
  81.                      var1.error(super.where, "invalid.method.invoke", super.right.type);
  82.                   }
  83.  
  84.                   return var3;
  85.                }
  86.  
  87.                var15 = var1.getClassDeclaration(Type.tObject);
  88.             }
  89.          }
  90.  
  91.          boolean var17 = false;
  92.  
  93.          for(int var19 = 0; var19 < super.args.length; ++var19) {
  94.             var3 = super.args[var19].checkValue(var1, var2, var3, var5);
  95.             var8[var19] = super.args[var19].type;
  96.             var17 = var17 || var8[var19].isType(13);
  97.          }
  98.  
  99.          if (this.field_0.equals(Constants.idInit)) {
  100.             var3 |= 1L;
  101.          }
  102.  
  103.          if (var17) {
  104.             return var3;
  105.          }
  106.  
  107.          this.clazz = var15.getClassDefinition(var1);
  108.          ClassDefinition var11 = var2.field.getClassDefinition();
  109.          this.field = this.clazz.matchMethod(var1, var11, this.field_0, var8);
  110.          if (this.field == null) {
  111.             if (this.field_0.equals(Constants.idInit)) {
  112.                String var23 = this.clazz.getName().getName().toString();
  113.                var23 = Type.tMethod(Type.tError, var8).typeString(var23, false, false);
  114.                var1.error(super.where, "unmatched.constr", var23, var15);
  115.                return var3;
  116.             }
  117.  
  118.             String var12 = this.field_0.toString();
  119.             var12 = Type.tMethod(Type.tError, var8).typeString(var12, false, false);
  120.             if (this.clazz.findAnyMethod(var1, this.field_0) == null) {
  121.                var1.error(super.where, "undef.meth", var12, var15);
  122.             } else {
  123.                var1.error(super.where, "unmatched.meth", var12, var15);
  124.             }
  125.  
  126.             return var3;
  127.          }
  128.  
  129.          if (var7 && !this.field.isStatic()) {
  130.             var1.error(super.where, "no.static.meth.access", this.field, this.field.getClassDeclaration());
  131.             return var3;
  132.          }
  133.  
  134.          if (this.field.isProtected() && super.right != null && !(super.right instanceof SuperExpression) && !var11.protectedAccess(var1, this.field, super.right.type)) {
  135.             var1.error(super.where, "invalid.protected.method.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
  136.             return var3;
  137.          }
  138.  
  139.          if (this.field.isAbstract() && super.right != null && super.right.op == 83) {
  140.             var1.error(super.where, "invoke.abstract", this.field, this.field.getClassDeclaration());
  141.             return var3;
  142.          }
  143.  
  144.          if (this.field.isConstructor() && var2.field.equals(this.field)) {
  145.             var1.error(super.where, "recursive.constr", this.field);
  146.          }
  147.  
  148.          var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
  149.       } catch (ClassNotFound var13) {
  150.          var1.error(super.where, "class.not.found", var13.name, var2.field);
  151.          return var3;
  152.       } catch (AmbiguousField var14) {
  153.          var1.error(super.where, "ambig.field", this.field_0, var14.field1, var14.field2);
  154.          return var3;
  155.       }
  156.  
  157.       if (super.right == null && !this.field.isStatic()) {
  158.          super.right = new ThisExpression(super.where, var2);
  159.          if ((var3 & 1L) == 0L) {
  160.             var1.error(super.where, "access.inst.before.super", Constants.idThis);
  161.          }
  162.       }
  163.  
  164.       var8 = this.field.getType().getArgumentTypes();
  165.  
  166.       for(int var18 = 0; var18 < super.args.length; ++var18) {
  167.          super.args[var18] = ((Node)this).convert(var1, var2, var8[var18], super.args[var18]);
  168.       }
  169.  
  170.       ClassDeclaration[] var20 = this.field.getExceptions(var1);
  171.  
  172.       for(int var21 = 0; var21 < var20.length; ++var21) {
  173.          if (var5.get(var20[var21]) == null) {
  174.             var5.put(var20[var21], this);
  175.          }
  176.       }
  177.  
  178.       super.type = this.field.getType().getReturnType();
  179.       return var3;
  180.    }
  181.  
  182.    public long check(Environment var1, Context var2, long var3, Hashtable var5) {
  183.       return this.checkValue(var1, var2, var3, var5);
  184.    }
  185.  
  186.    Expression inlineMethod(Environment var1, Context var2, Statement var3, boolean var4) {
  187.       if (var1.dump()) {
  188.          System.out.println("INLINE METHOD " + this.field + " in " + var2.field);
  189.       }
  190.  
  191.       Vector var5 = this.field.getArguments();
  192.       Statement[] var6 = new Statement[var5.size() + 2];
  193.       int var7 = 0;
  194.       if (this.field.isStatic()) {
  195.          var6[0] = new ExpressionStatement(super.where, super.right);
  196.       } else {
  197.          if (super.right != null && super.right.op == 83) {
  198.             super.right = new ThisExpression(super.right.where, var2);
  199.          }
  200.  
  201.          var6[0] = new VarDeclarationStatement(super.where, (LocalField)var5.elementAt(var7++), super.right);
  202.       }
  203.  
  204.       for(int var8 = 0; var8 < super.args.length; ++var8) {
  205.          var6[var8 + 1] = new VarDeclarationStatement(super.where, (LocalField)var5.elementAt(var7++), super.args[var8]);
  206.       }
  207.  
  208.       var6[var6.length - 1] = var3 != null ? var3.copyInline(var2, var4) : null;
  209.       InlineMethodExpression var9 = new InlineMethodExpression(super.where, super.type, this.field, new CompoundStatement(super.where, var6));
  210.       return var4 ? ((Expression)var9).inlineValue(var1, var2) : ((Expression)var9).inline(var1, var2);
  211.    }
  212.  
  213.    public Expression inline(Environment var1, Context var2) {
  214.       try {
  215.          if (super.right != null) {
  216.             super.right = this.field.isStatic() ? super.right.inline(var1, var2) : super.right.inlineValue(var1, var2);
  217.          }
  218.  
  219.          for(int var3 = 0; var3 < super.args.length; ++var3) {
  220.             super.args[var3] = super.args[var3].inlineValue(var1, var2);
  221.          }
  222.  
  223.          Object var4 = this;
  224.          if (var1.optimize() && this.field.isInlineable(var1, this.clazz.isFinal()) && (this.field_0 == null || !this.field_0.equals(Constants.idInit)) && !var2.field.isInitializer() && var2.field.isMethod() && var2.getInlineFieldContext(this.field) == null) {
  225.             Statement var5 = (Statement)this.field.getValue(var1);
  226.             if (var5 == null || var5.costInline(30) < 30) {
  227.                var4 = this.inlineMethod(var1, var2, var5, false);
  228.             }
  229.          }
  230.  
  231.          if (var2.field.isConstructor() && this.field.isConstructor() && super.right != null && super.right.op == 83 && this.field_0 != null) {
  232.             this.field_0 = null;
  233.  
  234.             for(FieldDefinition var9 = var2.field.getClassDefinition().getFirstField(); var9 != null; var9 = var9.getNextField()) {
  235.                if (var9.isVariable() && !var9.isStatic()) {
  236.                   Expression var6 = (Expression)var9.getValue(var1);
  237.                   if (var6 != null && !var6.equals(0)) {
  238.                      FieldExpression var7 = new FieldExpression(var9.getWhere(), new ThisExpression(var9.getWhere(), var2), var9.getName());
  239.                      var7.field = var9;
  240.                      var6 = new AssignExpression(var9.getWhere(), var7, var6.copyInline(var2));
  241.                      var6 = var6.inline(var1, var2);
  242.                      if (var6 != null) {
  243.                         var4 = new CommaExpression(var9.getWhere(), (Expression)var4, var6);
  244.                      }
  245.                   }
  246.                }
  247.             }
  248.          }
  249.  
  250.          return (Expression)var4;
  251.       } catch (ClassNotFound var8) {
  252.          throw new CompilerError(var8);
  253.       }
  254.    }
  255.  
  256.    public Expression inlineValue(Environment var1, Context var2) {
  257.       try {
  258.          if (super.right != null) {
  259.             super.right = this.field.isStatic() ? super.right.inline(var1, var2) : super.right.inlineValue(var1, var2);
  260.          }
  261.  
  262.          for(int var3 = 0; var3 < super.args.length; ++var3) {
  263.             super.args[var3] = super.args[var3].inlineValue(var1, var2);
  264.          }
  265.  
  266.          if (var1.optimize() && this.field.isInlineable(var1, this.clazz.isFinal()) && !var2.field.isInitializer() && var2.field.isMethod() && var2.getInlineFieldContext(this.field) == null) {
  267.             Statement var4 = (Statement)this.field.getValue(var1);
  268.             if (var4 == null || var4.costInline(30) < 30) {
  269.                return this.inlineMethod(var1, var2, var4, true);
  270.             }
  271.          }
  272.  
  273.          return this;
  274.       } catch (ClassNotFound var5) {
  275.          throw new CompilerError(var5);
  276.       }
  277.    }
  278.  
  279.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  280.       if (this.field.isStatic()) {
  281.          if (super.right != null) {
  282.             super.right.code(var1, var2, var3);
  283.          }
  284.       } else if (super.right == null) {
  285.          var3.add(super.where, 25, new Integer(0));
  286.       } else {
  287.          super.right.codeValue(var1, var2, var3);
  288.       }
  289.  
  290.       for(int var4 = 0; var4 < super.args.length; ++var4) {
  291.          super.args[var4].codeValue(var1, var2, var3);
  292.       }
  293.  
  294.       if (this.field.isStatic()) {
  295.          var3.add(super.where, 184, this.field);
  296.       } else if (!this.field.isConstructor() && !this.field.isPrivate() && (super.right == null || super.right.op != 83)) {
  297.          if (this.field.getClassDefinition().isInterface()) {
  298.             var3.add(super.where, 185, this.field);
  299.          } else {
  300.             var3.add(super.where, 182, this.field);
  301.          }
  302.       } else {
  303.          var3.add(super.where, 183, this.field);
  304.       }
  305.    }
  306.  
  307.    public boolean firstConstructor() {
  308.       return this.field_0.equals(Constants.idInit);
  309.    }
  310.  
  311.    public void print(PrintStream var1) {
  312.       var1.print("(" + Constants.opNames[super.op]);
  313.       if (super.right != null) {
  314.          var1.print(" ");
  315.          super.right.print(var1);
  316.       }
  317.  
  318.       var1.print(" " + (this.field_0 == null ? Constants.idInit : this.field_0));
  319.  
  320.       for(int var2 = 0; var2 < super.args.length; ++var2) {
  321.          var1.print(" ");
  322.          if (super.args[var2] != null) {
  323.             super.args[var2].print(var1);
  324.          } else {
  325.             var1.print("<null>");
  326.          }
  327.       }
  328.  
  329.       var1.print(")");
  330.    }
  331. }
  332.